-
Notifications
You must be signed in to change notification settings - Fork 416
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add corfidi MCS motion #3116
add corfidi MCS motion #3116
Conversation
seems I didn't completely cover this in my unit test, stand by... |
I'm on the fence as to whether I should be using pressure_weighted_mean or weighted_continuous average for the "cloud-layer winds". The original paper describes "a vector that represents cell advection by the mean cloud-layer wind (with “cloud layer” taken to be the 850–300-hPa layer)1" (Corfidi 2003) but then uses (wind_at_850+wind_at_700+wind_at_500+wind_at_300)/4 to estimate this. Thinking more on this, this seems to weight the winds at higher pressures more, so maybe I should switch? It doesn't make a huge difference... |
@wx4stg Just wanted to let you know that I have been looking at this when I have the cycles and been trying to figure out how I want to proceed on the "cloud-layer winds" problem. |
yeah--no problem, I meant to attend last week's dev call but forgot (oops), but I plan to start attending those once the semester gets going. |
Okay, so I've dug into this a bit and have attempted to reproduce the values produced in the paper and have not been able to do so (although very close in most circumstances), even with implementing their form of averaging for the cloud layer wind. My best guess is that the LLJ wind is the cause of the differences I'm seeing. I was not able to get the same value they propose for the 16 August 1997 case using either the 850-hPa LLJ method or the maximum wind in the lowest 1500 m. My thoughts at this point are that the pressure weighted average is likely better. SharpPy averages the winds over the lower 1500 m for the LLJ and also implements non-pressure weighted averaging for both the LLJ and the cloud layer winds. @mwilson14 Thoughts since you have thought about a lot of sounding indices in the past. |
Okay, here is the latest of what I have found when working to compare to the table provided in Confide (2003) with the current version of the implemented vector in the PR. In general, it doesn't match the values in the paper, but is close for some soundings, reasonable for many more, and closer to the observed values in other instances. I tried a couple of variations with only using the four levels and using a mean wind for the LLJ and all of those combinations made the errors greater. The only difference that was fairly small and zero in a number of cases was using the 850-hPa wind for the LLJ instead of the max wind in the lowest 1500 m. My best guess as to the differences is that unique LLJ vectors were used for different cases. I think we should implement a method within the function to be able to specify a particular LLJ u and v-component to override the default behavior. I think it is an open conversation whether to use the maximum in the lowest 1500 m or just the 850-hPa wind for the LLJ. If we do the latter, then we could reduce the need for the height as an extra input variable - though this would not be fully in line with the what the paper describes as a best practice. Note: I used Wyoming Sounding Archive and had to change the station name for
|
This implementation makes sense to me! I agree that the pressure-weighted wind is likely better and that having an option in the function to specify a LLJ vector is a good idea. Also, sorry for missing that first comment I was tagged in, that was the weekend I moved to Boulder so things were a bit chaotic. |
@wx4stg, okay so I think we have a final recommendation on implementation for this PR!
Let @dcamron or I know if you would like any help or want to punt any of these updates to us if you don't have the cycles at the midpoint of the current semester. |
@kgoebber thanks for the review! I have a few questions..
Ok, just to clarify, I'll add keyword args, something like llj_u and llj_v, which are None by default. If the function is called without specifying, then proceed to find LLJ as maximum below 850 hPa?
I agree with the idea of using pressure coordinate height for this, but this introduces a bit of an edge case: what if the sounding is from something like Denver where the surface pressure occasionally dips below 850 hPa? Raise ValueError? High altitude MCSes are... certainly not very typical, but just curious about how to handle this.
Hilariously, these updates could not have come at a better time, we just finished midterms so I have a little breathing room this week :) |
Yep! So in the end it should be something like...
@dopplershift, @dcamron thoughts on naming of LLJ u and v components?
I think raise a value error would be good and prompt to specify an LLJ u and v component. @dopplershift @dcamron thoughts?
Excellent! Hope midterms went well! |
While we usually try to avoid terse/abbreviated names so that the function is more self-documenting,
Agreed. Something like |
@kgoebber I think this covers the requested changes and provides tests, if you still have the code from your earlier comparison, you can try it again. strangely I can't get the bots to run.. |
There is a conflict with the main branch. There are a couple of ways to resolve the conflict. In general it is best of you update your main MetPy branch
The last command is the rebase in an interactive mode. It will notify you if there are conflicts that are not resolved automatically that might need your intervention. Once you have rebased, then you can push the branch updates as per usual. |
I see. I wasn't sure if y'all would want to handle that or not. thanks. |
Thanks for working with us on getting this in @wx4stg ! |
This adds support for Mesoscale Convective System storm motion as described in Corfidi 2003: https://journals.ametsoc.org/view/journals/wefo/18/6/1520-0434_2003_018_0997_cpampf_2_0_co_2.xml
Note that this implementation differs slightly from that of sharppy/SHARPpy's slightly, in that they use a non-pressure weighted wind for the cloud layer winds (this shouldn't have much of an effect on output in most cases) and they take the low-level jet as the mean of 0->1.5km AGL winds. My implementation looks for the maximum below 1.5 km AGL as I believe this is more in line with the original authors' intentions, "In the absence of a distinct low-level speed maximum in the vertical direction, the strongest wind in the lowest 5000 ft (1.5 km) is generally used, in accordance with Bonner (1968)". I'm extremely open to discussion on whether this is actually "better" or not though.
This is also my first contribution, so feel free to edit my documentation/code style/etc.
Thanks!